package com.tongtailian.www.stir.utils;

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;

import com.clj.fastble.BleManager;
import com.clj.fastble.scan.BleScanRuleConfig;

import java.util.UUID;

/**
 * Created by Administrator on 2019/4/1 0001.
 */
public class BleClient {
    public static BleClient bleClient;
    private Handler mHandler = new Handler(Looper.getMainLooper());

    public static BleClient getInstence() {
        if (bleClient == null) {
            bleClient = new BleClient();
        }
        return bleClient;
    }

    /**
     * 初始化
     *
     * @param activity
     */
    public void initBle(Activity activity) {
        BleManager.getInstance().init(activity.getApplication());
        BleManager.getInstance()
                .enableLog(true)
                .setReConnectCount(1, 5000)
                .setOperateTimeout(5000);
    }

    /**
     * 设置扫描规则
     *
     * @param str_uuid
     */
    public void setRulesBle(String str_uuid) {
        String[] uuids;
        if (TextUtils.isEmpty(str_uuid)) {
            uuids = null;
        } else {
            uuids = str_uuid.split(",");
        }
        UUID[] serviceUuids = null;
        if (uuids != null && uuids.length > 0) {
            serviceUuids = new UUID[uuids.length];
            for (int i = 0; i < uuids.length; i++) {
                String name = uuids[i];
                String[] components = name.split("-");
                if (components.length != 5) {
                    serviceUuids[i] = null;
                } else {
                    serviceUuids[i] = UUID.fromString(uuids[i]);
                }
            }
        }
        BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
                .setServiceUuids(serviceUuids)      // 只扫描指定的服务的设备，可选
                .setScanTimeOut(2500)              // 扫描超时时间，可选，默认10秒
                .build();
        BleManager.getInstance().initScanRule(scanRuleConfig);
    }

//    /**
//     * 扫描设备
//     *
//     * @param scanCallback
//     */
//    public void ScanBle(final ScanCallback scanCallback) {
//        scanBle(scanCallback);
//    }
//
//    private void scanBle(final ScanCallback scanCallback) {
//        BleManager.getInstance().scan(new BleScanCallback() {
//            @Override
//            public void onScanStarted(boolean success) {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        scanCallback.onStart();
//                    }
//                });
//            }
//
//            @Override
//            public void onLeScan(BleDevice bleDevice) {
//                super.onLeScan(bleDevice);
//            }
//
//            @Override
//            public void onScanning(final BleDevice bleDevice) {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        scanCallback.onScanning(bleDevice);
//                    }
//                });
//            }
//
//            @Override
//            public void onScanFinished(final List<BleDevice> scanResultList) {
//
//            }
//        });
//    }
//
//    /**
//     * 取消扫描
//     */
//    public void cancleBleScan() {
//        BleManager.getInstance().cancelScan();
//    }
//
//    /**
//     * 是否连接
//     */
//    public boolean isConnected(BleDevice bleDevice) {
//        return BleManager.getInstance().isConnected(bleDevice);
//    }
//
//    public boolean isConnected(String bleDevice) {
//        return BleManager.getInstance().isConnected(bleDevice);
//    }
//
//    /**
//     * 取消连接
//     */
//    public void disconnect(BleDevice bleDevice) {
//        BleManager.getInstance().disconnect(bleDevice);
//    }
//
//
//    /**
//     * 连接回调
//     *
//     * @param device
//     * @param callback
//     */
//    public void ConnectBle(BleDevice device, ConnectCallback callback) {
//        connectBle(device.getMac(), callback);
//    }
//
//    public void ConnectBle(String deviceMac, ConnectCallback callback) {
//        connectBle(deviceMac, callback);
//    }
//
//    private void connectBle(String deviceMac, final ConnectCallback callback) {
//
//        BleManager.getInstance().connect(deviceMac, new BleGattCallback() {
//            @Override
//            public void onStartConnect() {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        callback.onStartConnect();
//                    }
//                });
//            }
//
//            @Override
//            public void onConnectFail(BleDevice bleDevice, BleException exception) {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        callback.onFailedConnect();
//                    }
//                });
//            }
//
//            @Override
//            public void onConnectSuccess(final BleDevice bleDevice, BluetoothGatt gatt, int status) {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        callback.onSuccessConnect(bleDevice);
//                    }
//                });
//            }
//
//            @Override
//            public void onDisConnected(final boolean isActiveDisConnected, final BleDevice bleDevice, BluetoothGatt gatt, int status) {
//                runOnMainThread(new Runnable() {
//                    @Override
//                    public void run() {
//                        callback.onDisConnect(isActiveDisConnected, bleDevice);
//                    }
//                });
//            }
//        });
//    }
//
//    /**
//     * 打开通知
//     *
//     * @return
//     */
//    public void NotifyBle(BleDevice device, String Service_Uuid, String Notify_Uuid, NotifyCallback callback) {
//        notifyBle(device, Service_Uuid, Notify_Uuid, callback);
//    }
//
//    private void notifyBle(final BleDevice device, String Service_Uuid, String Notify_Uuid, final NotifyCallback callback) {
//        BleManager.getInstance().notify(
//                device,
//                Service_Uuid,
//                Notify_Uuid,
//                new BleNotifyCallback() {
//                    @Override
//                    public void onNotifySuccess() {
//                        Log.d("BleActivity", "onNotifySuccess  " + device.getMac());
//                        new Thread(new Runnable() {
//                            @Override
//                            public void run() {
//                                try {
//                                    Thread.sleep(100);
//                                    runOnMainThread(new Runnable() {
//                                        @Override
//                                        public void run() {
//                                            callback.onNotifySuccess();
//                                        }
//                                    });
//                                } catch (InterruptedException e) {
//                                    e.printStackTrace();
//                                }
//                            }
//                        }).start();
//                    }
//
//                    @Override
//                    public void onNotifyFailure(final BleException exception) {
//                        runOnMainThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                callback.onFailureSuccess(exception);
//                            }
//                        });
//                    }
//
//                    @Override
//                    public void onCharacteristicChanged(final byte[] data) {
//                        Log.d("BleActivity", "接到通知: " + HexUtil.formatHexString(data, true));
//                        runOnMainThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                callback.onCharacteristicChanged(data);
//                            }
//                        });
//                    }
//                }
//        );
//    }
//
//    /**
//     * 写入数据
//     *
//     * @return
//     */
//    public void WriteBle(BleDevice bleDevice, String service_uuid, String write_uuid,
//                         byte[] cmd, WriteCallback callback) {
//        writeBle(bleDevice, service_uuid, write_uuid, cmd, callback);
//    }
//
//    private void writeBle(BleDevice bleDevice, String service_uuid, String write_uuid,
//                          byte[] cmd, final WriteCallback callback) {
//
//        BleManager.getInstance().write(
//                bleDevice,
//                service_uuid,
//                write_uuid,
//                cmd,
//                new BleWriteCallback() {
//                    @Override
//                    public void onWriteSuccess(final int current, final int total, final byte[] data) {
//                        runOnMainThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                callback.onWriteSuccess(current, total, data);
//                            }
//                        });
//
//                    }
//
//                    @Override
//                    public void onWriteFailure(final BleException exception) {
//                        runOnMainThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                callback.onWriteFailed(exception);
//                            }
//                        });
//                    }
//                });
//
//    }
//
//    private boolean isMainThread() {
//        return Looper.myLooper() == Looper.getMainLooper();
//    }
//
//    private void runOnMainThread(Runnable runnable) {
//        if (isMainThread()) {
//            runnable.run();
//        } else {
//            if (mHandler != null) {
//                mHandler.post(runnable);
//            }
//        }
//    }
}
